perm filename ERROR.SAI[PUB,TES] blob
sn#233537 filedate 1976-08-21 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00016 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00003 00002 BEGOF("ERROR")
C00006 00003 PUBLIC SIMPLE PROCEDURE ERROR! $"#
C00007 00004 IFK CMUVER OR SAILVER THENK
C00009 00005 PUBLIC SIMPLE PROCEDURE DUSERERR $"#
C00010 00006 PUBLIC STRING SIMPLE PROCEDURE EARLYWARNING(STRING MESSG) $"#
C00011 00007 PUBLIC STRING SIMPLE PROCEDURE ERRLINE $"#
C00012 00008 PUBLIC SIMPLE PROCEDURE IMPOSSIBLE(STRING WHERE) $"#
C00013 00009 IFSITE TENEX THENK
C00015 00010 IFK ITSVER THENK COMMENT THEIR USERERR HAS 3 ARGS
C00016 00011 PRIVATE SIMPLE INTEGER PROCEDURE NREPORT(INTEGER LOC STRING MESG, RSP) $"#
C00017 00012 PUBLIC SIMPLE INTEGER PROCEDURE REPORT (INTEGER LOC STRING MESG, RSP) $"#
C00024 00013 PUBLIC STRING SIMPLE PROCEDURE SOMEINPUT $"#
C00025 00014 PUBLIC STRING PROCEDURE TYPEIN $"#
C00026 00015 PUBLIC STRING SIMPLE PROCEDURE WARNN(REFERENCE BOOLEAN QUIETER STRING SHORT!VERSION,LONG!VERSION) $"#
C00028 00016 FINISHED
C00029 ENDMK
C⊗;
BEGOF("ERROR")
COMMENT
*** Variations at Different Sites ***
CALLEDITOR works only if compiler-editor linkages are available, and
is different at each site.
LOSERR is used at sites with a pre-April-74 SAIL lacking the
three-argument form of USERERR.
***
Pass One Error Handler, first done sans-SAIL by Rich Johnsson.
Whenever possible, PUB and SAIL errors are trapped by the procedure
REPORT. However, SAIL requires that REPORT be a SIMPLE PROCEDURE, so
to avoid recursion, there are times that REPORT is disabled and
NREPORT or USERERR is used instead. Furthermore, before PUB
initiallization is complete, REPORT would not work, so EARLYWARNING
(which calls USERERR) is used for errors instead of the usual WARNN
(which calls REPORT).
WARN(SHORT, LONG) puts the error message LONG on the terminal. IF
SHORT = "=", the same message is put in the right margin in
DEBUGmode., if SHORT = NULL, no message goes in the right margin.,
else, SHORT goes in the right margin.
Actually, WARN(SHORT,LONG) is a macro which expands to
WARNN(UNIQUEOWNINTEGERVARIABLE, SHORT, LONG) so that there is a place
to remember the occurrence of "Q" and "A" responses.
;
EXTERNAL INTEGER !ERRP! ;
PROCEDURES
PUBLIC SIMPLE PROCEDURE ERROR! ;$"#
BEGIN "ERROR!"
TES 8/20/74 INTERCEPT SAIL ERRORS ;
!ERRP! ← LOCATIONOFERROR ← LOCATION(REPORT) ;
COMMENT THE VARIABLE GETS AROUND A SAIL BUG FIXED BY RHT SEP 74;
END "ERROR!" ;
IFK CMUVER OR SAILVER THENK
RKJ: 6-25-74 Do your own USERERR;
PRIVATE PROCEDURE CALLEDITOR(STRING EDNAME) ;$"#
BEGIN TES 8/20/74 ADDED SAIL CASES ;
JFR 8-21-76 EDFILE;
STRING FILE;
INTEGER LINE,PAGE;
FILE←INCHWL;
SETPRINT(NULL,"T"); JFR 7-30-76 CLOSE LOG FILE IF ANY;
IF FULSTR(FILE)
THEN LINE←PAGE←0
ELSE
BEGIN "DEFAULTFILE"
FILE←THISFILE;
LINE←IF EQU(EDNAME,"E") THEN CVD(SRCLINE) ELSE CVASC(SRCLINE) LOR 1;
PAGE←CVD(SRCPAGE);
END "DEFAULTFILE";
EDFILE(FILE,LINE,PAGE);
END "CALLEDITOR";
ENDC
PUBLIC SIMPLE PROCEDURE DUSERERR ;$"#
BEGIN "DUSERERR"
STRING USER!MESSG;
PASS;
USER!MESSG ← E(NULL,NULL);
IF ON THEN WARN("=",USER!MESSG);
END "DUSERERR";
PUBLIC STRING SIMPLE PROCEDURE EARLYWARNING(STRING MESSG) ;$"#
USERERR(0,1,MESSG) ; TES 8/20/74 USED BEFORE INITIALLIZATION IS COMPLETE ;
PUBLIC STRING SIMPLE PROCEDURE ERRLINE ;$"#
RETURN(IF EQU(MAINFILE, THISFILE) THEN SRCLINE
ELSE THISFILE&SP&SRCLINE) ;
PUBLIC SIMPLE PROCEDURE IMPOSSIBLE(STRING WHERE) ;$"#
WARN("=","Impossible CASE index in " & WHERE &
" at " & SOMEINPUT);
IFSITE TENEX THENK
PRIVATE SITE(TENEX) SIMPLE STRING PROCEDURE INCHWL ;$"#
BEGIN
STRING S ; INTEGER C ;
S ← NULL ;
DO
BEGIN
C ← PBIN ;
IF C = CTLA THEN
IF NULSTR(S) OR EQU(S[∞-3 TO ∞], CRLF&"##") THEN
ELSE BEGIN
TES 8/23/74 ↑A ECHOES ANYWAY, SO FORGET PBOUT("\") ;
PBOUT(S[∞ FOR 1]) ;
S ← S[1 TO ∞-1] ;
END
ELSE IF C = CTLS THEN OUTSTR(" =" & EOL & "#" & S)
ELSE IF C = EOL OR C = ALTMODE THEN RETURN(S)
ELSE IF C = CTLV THEN S ← S & PBIN
ELSE IF C=RUBOUT THEN
BEGIN
OUTSTR(" XXX" & EOL & "#") ;
S ← NULL ;
END
ELSE IF C = LF THEN TES 8/23/74 ;
IF LAST<4 THEN RETURN(S)
ELSE BEGIN OUTSTR(CR&"##") ; S ← S & (CRLF&"##") END
ELSE IF C = CTLQ THEN TES 8/23/74 ;
BEGIN
OUTSTR("←"&CRLF&"#") ;
WHILE FULSTR(S) AND NOT EQU(S[∞-3 TO ∞],CRLF&"##") DO S←S[1 TO ∞-1] ;
IF FULSTR(S) THEN OUTSTR("#") ;
END
ELSE S ← S & C ;
END UNTIL FALSE ;
END "INCHWL" ;
ENDC
IFK ITSVER THENK COMMENT THEIR USERERR HAS 3 ARGS ;
PRIVATE SIMPLE PROCEDURE LOSERR(INTEGER RSP) ;$"#
BEGIN
DEFINE !BREAK = " '45000000000" ;
EXTERNAL INTEGER JOBSA ;
IF RSP="X"
THEN START!CODE !BREAK '16,'40000 END
ELSE IF RSP="S"
THEN START!CODE MOVE 1,JOBSA; JRST (1) END
ELSE IF RSP="D" THEN START!CODE !BREAK '16,'3000000 END;
END "LOSERR";
ENDC
PRIVATE SIMPLE INTEGER PROCEDURE NREPORT(INTEGER LOC; STRING MESG, RSP) ;$"#
RETURN(RSP + 3 LSH 18) ; TES 8/20/74 CALLED BY REPORT ;
PUBLIC SIMPLE INTEGER PROCEDURE REPORT (INTEGER LOC; STRING MESG, RSP) ;$"#
BEGIN "REPORT" RKJ 6/25/74 TES 8/20/74 ;
JFR 7-30-76 ADDED LOGGING OPTION;
COMMENT SAIL CALLS REPORT(LOC,CRLF&MESG&CRLF,NULL),
WARN CALLS REPORT(0,MESG,NULL|"A"),
OTHERS CALL REPORT(0,MESG|NULL,RSP) ;
EXTERNAL INTEGER !JBSA,!JBDDT;
INTEGER CHAR;
DEFINE CLRBFI= [START!CODE TTCALL '11,0 END];
BOOLEAN LOGGING; STRING LOGSTR;
SIMPLE PROCEDURE OUTLOG(STRING MESG); BEGIN "OUTLOG"
COMMENT necessary because message is typed before "L" response;
LOGSTR←LOGSTR & MESG;
OUTSTR(MESG) END "OUTLOG";
IF LOC=0 AND NOT SWDBACK THEN OUTLOG(CRLF) ; SWDBACK←TRUE;
IF FULSTR(MESG) THEN BEGIN OUTLOG(MESG); IF LOC=0 THEN OUTLOG(CRLF) END ;
IF NOT ERRLF THEN
IF (CHAR←INCHRS)=LF
THEN ERRLF←TRUE;
IF LOC THEN OUTLOG(
"This is a SAIL error - Probably a PUB bug. Called from location "&CVOS(RH(LOC))&CRLF) ;
IF NOT ON THEN OUTLOG("In the false part of a conditional"&CRLF) ;
OUTLOG("Line/Page "&ERRLINE&"/"&SRCPAGE&"["&MACLINE&"]"&CRLF) ;
CHAR ← RSP ;
IF NOT ERRLF THEN
WHILE TRUE DO
BEGIN "ERRLOOP"
IF NOT CHAR THEN
BEGIN
OUTCHR("↑");
IFC TENEX THENC CLRBUF ELSEC CLRBFI ENDC ;
CHAR ← INCHRW ;
IF "a" LEQ CHAR LEQ "z" THEN CHAR ← CHAR LAND '137 ;
END ;
IF CHAR=CR THEN BEGIN INCHWL; CHAR←0; DONE END ELSE
IF CHAR="C" OR CHAR='37 THEN BEGIN CHAR←0; DONE END ELSE
IF CHAR=LF THEN BEGIN ERRLF←TRUE; CHAR←0; DONE END ELSE
IF CHAR="L" THEN BEGIN
IF LOGGING THEN OUTSTR("ALREADY") ELSE
SETPRINT(OUTFILE & ".LOG", "F");
OUTSTR(" LOGGING " & OUTFILE & ".LOG");
LOGGING←TRUE; CHAR←0 END ELSE
IF CHAR="X" THEN DONE ELSE
IF CHAR="S" THEN DONE ELSE
IF CHAR="D" THEN
IFC TENEX THENC DONE ELSE ELSEC
BEGIN
IF !JBDDT NEQ 0
THEN DONE
ELSE OUTSTR(CRLF&"No DDT"&CRLF);
END ELSE
ENDC
IFC SAILVER OR CMUVER THENC
IF CHAR="E" THEN CALLEDITOR(IFC SAILVER THENC "SOS" ELSEC "LINED" ENDC) ELSE
ENDC
IFC SAILVER THENC
IF CHAR="T" THEN CALLEDITOR("E") ELSE
ENDC
IF CHAR="P" THEN
BEGIN TES: PUB INTERACTIVE DEBUGGER ;
INTEGER LASTWAS, TEXTWAS, BRCWAS, ONWAS ;
LASTWAS←LAST ; TEXTWAS←TEXTMODE ; ONWAS←ON ; ON←TRUE ;
OUTSTR(CRLF&"= = = = ="&CRLF) ;
!ERRP! ← 0 ; COMMENT PREVENT RECURSION ;
SWICH("START PUB!DEBUG END;;" &
(IF NOT TEXTMODE THEN CRLF&TB&TB
ELSE RCBRAK), -1, 0) ; TES 8/23/74;
TEXTMODE ← 0 ; TES 8/23/74 ;
PASS ; STATEMENT ;
!ERRP! ← LOCATIONOFERROR ;
OUTSTR("= = = = ="&CRLF) ;
ON ← ONWAS ;
IF TEXTWAS THEN
BEGIN
WHILE LAST>LASTWAS DO SWICHBACK ;
EMPTYTHIS ; EMPTYTHAT ;
TEXTMODE ← TRUE ; BRC ← BRCWAS ;
END ;
END
ELSE
IF CHAR = "Q" AND NOT LOC THEN
BEGIN LOC←TRUE; OUTLOG(CRLF) ; DONE END ELSE
IF CHAR = "A" AND NOT LOC THEN
BEGIN
LOC←TRUE;
OUTLOG(IF RSP="A" THEN "AUTO-CONTINUE"&CRLF ELSE CRLF) ;
DONE ;
END ELSE
IF CHAR = "?" THEN
BEGIN
OUTSTR("Reply" & CRLF &
"<CR> to continue," & CRLF &
"<LF> to continue automatically from all messages," & CRLF &
"""A"" to continue automatically from this message,"& CRLF &
"""Q"" to quiet this message," & CRLF &
"""P"" to enter PUB debug loop, " & CRLF
);
IFC NOT TENEX THENC IF !JBDDT NEQ 0 THEN ENDC
OUTSTR("""D"" to enter DDT, ") ;
OUTSTR(
IFC SAILVER THENC
"""E"" or ""T"" to EDIT, "&
ELSEC
IFC PARCVER THENC
"""E"" to EDIT, "&
ENDC ENDC
IFC NOT(ITSVER) THENC
"""L"" to log errors, " & ENDC
"""X"" to exit, ""S"" to start over"&CRLF);
END ELSE OUTSTR(" ? FOR HELP"&CRLF) ;
CHAR ← 0 ;
END "ERRLOOP" ;
IF LOGGING THEN PRINT(LOGSTR); LOGSTR←NULL;
IF LOC OR NOT CHAR THEN RETURN(CHAR + 3 LSH 18)
ELSE BEGIN "BUGGY"
!ERRP! ← LOCATION(NREPORT) ; COMMENT SIMPLE PROCEDURES CAN'T RECURSE ;
IFC ITSVER THENC
LOSERR(CHAR) ;
ELSEC
USERERR(0, 1, NULL, CHAR) ;
ENDC
!ERRP! ← LOCATIONOFERROR ;
RETURN(0) ;
END "BUGGY" ;
END "REPORT";
PUBLIC STRING SIMPLE PROCEDURE SOMEINPUT ;$"#
RETURN(SP&THISWD&SP&
(IF THATISFULL THEN LIT!ENTITY&LIT!TRAIL ELSE NULL)&INPUTSTR[1 TO 80]);
PUBLIC STRING PROCEDURE TYPEIN ;$"#
BEGIN
RKJ: 6-FEB-75 MODS FOR AUTOCRLF;
IF NOT ON THEN RETURN (NULL); RKJ: 5-10-74 ;
IF (NOT SWDBACK) AND AUTOCRLF THEN BEGIN OUTSTR(CRLF) ; SWDBACK ← TRUE END ;
IF AUTOCRLF THEN OUTSTR("#") ;
RETURN(INCHWL) ;
END "TYPEIN" ;
PUBLIC STRING SIMPLE PROCEDURE WARNN(REFERENCE BOOLEAN QUIETER; STRING SHORT!VERSION,LONG!VERSION) ;$"#
BEGIN "WARN"
COMMENT USUALLY CALLED BY WARN(SHORT, LONG) -- DEFINED AS:
BEGIN OWN INTEGER <NEWNAME> ., WARNN(<NEWNAME>, SHORT, LONG) END ;
COMMENT MAYBE THERE WAS A "Q" RESPONSE BEFORE ;
IF QUIETER="Q" OR NULSTR(LONG!VERSION) THEN
ELSE IF !ERRP! THEN QUIETER ← RH(REPORT(0, LONG!VERSION, QUIETER))
ELSE USERERR(0, 1, LONG!VERSION) ; COMMENT PREVENT RECURSION ;
IF DEBUG AND MESGS<MESSMAX AND FULSTR(SHORT!VERSION) THEN
MESGSARR[MESGS←MESGS+1] ← IF SHORT!VERSION = "=" THEN LONG!VERSION ELSE SHORT!VERSION ;
RETURN(NULL) ;
END "WARN" ;
FINISHED
ENDOF("ERROR")